'use strict';


const semver = require('semver')        // 版本比对
const colors = require('colors/safe')   // 终端打印不同颜色
const log = require('@hjy-cli/log')

const LOWEST_NODE_VERSION = '12.0.0'// node最低版本

class Command {
    constructor(argv) {
        log.verbose('Command constructor', argv)
        // [
        // 'test-project',
        //     {
        //         commands: [],
        //         options: [ [Object] ],
        //         rawArgs: null,
        //         force: true,
        //         args: [ 'test-project' ]
        //     }
        // ]
        if (!argv) {
            throw new Error('参数不能为空!')
        }
        if (!Array.isArray(argv)) {
            throw new Error('参数必须为数组！');
        }
        if (argv.length < 1) {
            throw new Error('参数列表为空！');
        }

        this._argv = argv

        let runner = new Promise(((resolve, reject) => {
            let chain = Promise.resolve()
            // 检查node版本号，有的低版本node不支持语法
            chain = chain.then(() => this.checkNodeVersion())
            // 参数初始化
            chain = chain.then(() => this.initArgs())
            chain = chain.then(() => this.init())
            chain = chain.then(() => this.exec())
            chain.catch(err => {
                log.error(err.message)
            })
        }))
    }

    // 参数初始化
    initArgs() {
        this._cmd = this._argv[this._argv.length - 1]
        this._argv = this._argv.slice(0, this._argv.length - 1)
    }

    // 检查node版本号，有的底版本node不支持语法
    checkNodeVersion() {
        // 第一步：获取当前node版本号
        const currentVersion = process.version
        // 第二步：比对最低版本号
        const lowestVersion = LOWEST_NODE_VERSION
        // gt大于
        // gte大于等于
        if (!semver.gte(currentVersion, lowestVersion)) {
            // 错误信息用colors.red红色字体演示出来
            throw new Error(colors.red(`hjy-cli 需要安装 v${lowestVersion} 以上版本的Node.js`))
        }
    }

    // 在commands/init里实现
    init() {
        throw new Error('init必须实现！')
    }

    // 在commands/init里实现
    exec() {
        throw new Error('exec必须实现！')
    }
}

module.exports = Command;